package auth

import (
	"admin/dto"
	m "admin/models/auth"
	"admin/utils/pagination"
	"gorm.io/gorm"
)

// AdminUserInterface 管理员用户仓库接口
type AdminUserInterface interface {
	List(req dto.ListAdminUserReq) (*pagination.PageResult[m.AdminUser], error)
	Create(u *m.AdminUser) error
	Update(u *m.AdminUser) error
	Delete(id int64) error
	GetByID(id int64) (*m.AdminUser, error)
	GetByUsername(username string) (*m.AdminUser, error)
}

// AdminUserRepo 基于GORM的管理员用户仓库实现
type AdminUserRepo struct {
	db *gorm.DB
}

// NewAdminUserRepo 创建基于GORM的管理员用户仓库实例
// db: GORM数据库连接
// 返回值: 管理员用户仓库实例指针
func NewAdminUserRepo(db *gorm.DB) *AdminUserRepo {
	return &AdminUserRepo{db: db}
}

// List 获取管理员用户列表
// 返回值: 管理员用户列表和错误信息
func (r *AdminUserRepo) List(req dto.ListAdminUserReq) (*pagination.PageResult[m.AdminUser], error) {
	db := r.db.Model(&m.AdminUser{}).Preload("Roles")
	// 如果有关键字筛选
	if req.Keyword != "" {
		db = db.Where("username LIKE ? OR nickname LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
	}
	if req.Status != 0 {
		db = db.Where("status = ?", req.Status)
	}
	if req.RoleID != 0 {
		db = db.Joins("JOIN user_role ON user_role.user_id = admin_users.id").
			Joins("JOIN roles ON roles.id = user_role.role_id").
			Where("roles.id = ?", req.RoleID)
	}
	// 分页查询
	return pagination.Paginate[m.AdminUser](db, req.PageInfo, &[]m.AdminUser{})
}

// Create 创建管理员用户
// u: 管理员用户对象
// 返回值: 错误信息
func (r *AdminUserRepo) Create(u *m.AdminUser) error {
	// 使用GORM创建管理员用户
	return r.db.Create(u).Error
}

// Update 更新管理员用户
// u: 管理员用户对象
// 返回值: 错误信息
func (r *AdminUserRepo) Update(u *m.AdminUser) error {
	// 使用GORM保存管理员用户
	return r.db.Save(u).Error
}

// Delete 删除管理员用户≠
// id: 管理员用户ID
// 返回值: 错误信息
func (r *AdminUserRepo) Delete(id int64) error {
	// 使用GORM删除指定ID的管理员用户
	return r.db.Delete(&m.AdminUser{}, id).Error
}

// GetByID 根据ID获取管理员用户
// id: 管理员用户ID
// 返回值: 管理员用户对象和错误信息
func (r *AdminUserRepo) GetByID(id int64) (*m.AdminUser, error) {
	var obj m.AdminUser
	// 预加载角色信息并根据ID查询管理员用户
	if err := r.db.Preload("Roles").First(&obj, id).Error; err != nil {
		return nil, err
	}
	return &obj, nil
}

// GetByUsername 根据用户名获取管理员用户
// username: 用户名
// 返回值: 管理员用户对象和错误信息
func (r *AdminUserRepo) GetByUsername(username string) (*m.AdminUser, error) {
	var obj m.AdminUser
	// 根据用户名查询管理员用户
	if err := r.db.Where("username = ?", username).First(&obj).Error; err != nil {
		return nil, err
	}
	return &obj, nil
}
